// get 请求
import axios from "axios";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import {Message} from "element-ui";
import {getToken, removeToken} from "@/util/auth";
import bus from "@/bus/bus";

// const errorMessages = {
//     401: "没有权限访问",
//     403: "禁止访问",
//     404: "资源找不到",
//     500: "服务器故障",
// };

const request = axios.create({
    timeout: 60000,  // 请求 60s 超时
});

// 请求拦截器
request.interceptors.request.use(
    (config) => {
        // 成功的回调
        // config就是请求的配置对象 { method, url, body, params, ... }
        // 2. 增加请求的公共参数 token
        const token = getToken();
        if (token) {
            config.headers['Wr-Token'] = token;
        }
        NProgress.start();

        // 返回值config会作为发送请求的配置对象，去发送请求
        return config;
    },
    error => {
        // 失败的回调，一般触发不了
        return Promise.error(error);
    }
);

// 需要跳转登录的错误码
const toLoginErrorCodes = ['A0311', 'A0301', 'A0230']

// 响应拦截器
request.interceptors.response.use(response => {
    NProgress.done();
    return response.data;
}, error => {
    NProgress.done();
    // 我们可以在这里对异常状态作统一处理
    let errorData = error.response.data
    if (!toLoginErrorCodes.includes(errorData.code)) {
        Message({
            message: errorData.msg,
            type: 'error'
        })
    }
    // 授权过期 / 未授权
    if (toLoginErrorCodes.includes(errorData.code)) {
        // 清空token
        removeToken()
        // 打开登录弹窗
        bus.$emit("goToLogin")
    }
    return Promise.reject(errorData)
})

export default request;